#define _CRT_SECURE_NO_WARNINGS 1

#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>

using namespace std;

//const int N = 110, INF = 100000000;
//
//int n, f[N][N];
//
//bool is_match(char l, char r)
//{
//    if (l == '(' && r == ')') return true;
//    if (l == '[' && r == ']') return true;
//    return false;
//}

//int main()
//{
//    string s;
//    cin >> s;
//    n = s.size();
//    for (int i = 0; i < n; i++) f[i][i] = 1;
//    for (int len = 2; len <= n; len++)
//    {
//        for (int i = 0; i + len - 1 < n; i++)
//        {
//            int j = i + len - 1;
//            f[i][j] = INF;
//            if (is_match(s[i], s[j])) f[i][j] = f[i + 1][j - 1];
//            if (j >= 1)  f[i][j] = min(f[i][j], max(f[i + 1][j], f[i][j - 1]) + 1);
//            for (int k = i; k < j; k++)  f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
//        }
//    }
//    cout << f[0][n - 1];
//    return 0;
//}

//char s1[1010];

//int main()
//{
//    string s;
//    cin >> s;
//    int i = 0, j = 0;
//    for (i = 0; i < s.size();)
//    {
//        if (!isdigit(s[i]))
//        {
//            s1[j++] = s[i++];
//        }
//        else
//        {
//            int t = s[i] - '0';
//            for (int k = 0; k < t-1; k++)
//            {
//                s1[j++] = s[i - 1];
//            }
//            i++;
//        }
//    }
//    s1[j] = '\0';
//    printf("%s", s1);
//    return 0;
//}

const int N = 40;
int n, m;
int f[N][N];

int main()
{
    scanf("%d%d", &n, &m);
    f[1][1] = 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (i == 1 && j == 1) continue;
            if (i % 2 || j % 2)
                f[i][j] = f[i - 1][j] + f[i][j - 1];
        }
    }
    printf("%d", f[n][m]);
    return 0;
}